# 导入 OpenCV 库，用于图像处理，如读取图像、进行直方图均衡化等操作
import cv2
# 导入 matplotlib 库的 pyplot 模块，用于绘制图像和直方图，方便可视化结果
import matplotlib.pyplot as plt
# 导入 numpy 库，用于处理数值计算，在图像处理中经常会用到数组操作
import numpy as np

# 读取图像
# 使用 cv2.imread 函数以灰度模式读取指定路径的图像
# 'your_image.jpg' 需替换为实际的图像文件路径
'''
当你使用 image = cv2.imread('test.png', 0) 时，后面的数值 0 代表读取图像的模式，具体含义如下：
cv2.IMREAD_COLOR（值为 1）：这是默认模式，会以彩色模式读取图像，忽略图像的透明度通道。最终返回的图像是一个包含三个通道（红、绿、蓝）的三维数组。
cv2.IMREAD_GRAYSCALE（值为 0）：以灰度模式读取图像。也就是将图像转换为单通道的灰度图像，最终返回的是一个二维数组。
cv2.IMREAD_UNCHANGED（值为 -1）：以包含透明度通道的方式读取图像。如果图像是带有透明度通道的（像 PNG 图像），那么会保留该通道信息。返回的图像可能是三维数组（对于彩色带透明通道的图像），也可能是二维数组（对于灰度带透明通道的图像）。
'''
# 0 表示以灰度模式读取，即读取的图像为单通道的灰度图像
image = cv2.imread('test.png', 1)  

# 将 BGR 格式转换为 RGB 格式，因为 matplotlib 使用 RGB 格式显示图像
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

# 分离三个通道
b, g, r = cv2.split(image)

# 对每个通道分别进行直方图均衡化
equalized_b = cv2.equalizeHist(b)
equalized_g = cv2.equalizeHist(g)
equalized_r = cv2.equalizeHist(r)

# 合并均衡化后的通道
equalized_image = cv2.merge((equalized_b, equalized_g, equalized_r))

# 显示原始图像和均衡化后的图像
plt.figure(figsize=(10, 5))

plt.subplot(121)
plt.imshow(image)
plt.title('Original Image')
plt.axis('off')

plt.subplot(122)
plt.imshow(equalized_image)
plt.title('Equalized Image')
plt.axis('off')

plt.show()

# 显示原始图像和均衡化后的直方图
plt.figure(figsize=(10, 5))

# 绘制原始图像的直方图
plt.subplot(121)
colors = ('r', 'g', 'b')
for i, color in enumerate(colors):
    hist = cv2.calcHist([image], [i], None, [256], [0, 256])
    plt.plot(hist, color=color)
plt.title('Original Histogram')

# 绘制均衡化后图像的直方图
plt.subplot(122)
for i, color in enumerate(colors):
    hist = cv2.calcHist([equalized_image], [i], None, [256], [0, 256])
    plt.plot(hist, color=color)
plt.title('Equalized Histogram')

plt.show()
    